﻿using Autofac;
using wwl.Contract.Interfaces.Common;
using wwl.DataAccess.Repositories.Common;

namespace wwl.WebApi.AutofacModeules
{
  /// <summary>
  /// Autofac 通用服务注册模块（WebApi层）
  /// 负责注册项目中通用的数据访问组件（如仓储、数据上下文包装器），统一管理依赖注入关系
  /// 继承 Autofac 的 <see cref="Module"/> 类，通过模块化方式组织注册逻辑，提升配置清晰度
  /// </summary>
  public class CommonModule : Module
  {
    /// <summary>
    /// 重写模块加载方法，定义依赖注入的注册规则
    /// </summary>
    /// <param name="builder">Autofac 容器构建器，用于注册服务与接口的映射关系</param>
    protected override void Load(ContainerBuilder builder)
    {
      // 注册数据上下文包装器：将 EfWrapper 实现类与 IWrapper 接口关联
      // 生命周期为 InstancePerLifetimeScope（每个请求生命周期内单例），确保同一请求中数据上下文一致
      builder.RegisterType<EfWrapperRepository>()
          .As<IEfWrapper>()
          .InstancePerLifetimeScope();

      // 注册泛型仓储：将 GenericRepository<> 泛型实现类与 IRepository<> 泛型接口关联
      // 支持所有继承自 BaseEntity 的领域实体，自动适配不同实体的仓储需求
      // 生命周期为 InstancePerLifetimeScope，与数据上下文生命周期保持一致，避免跨请求共享仓储实例
      builder.RegisterGeneric(typeof(GenericRepository<>))
          .As(typeof(IGenericRepository<>))
          .InstancePerLifetimeScope();
    }
  }
}